<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义构造函数创建对象</title>
    <style>
        .标注{
            color: red;
        }
    </style>
</head>
<body>
<h3>构造函数</h3>
<p>
    创建对象有三种方式 <br>
    3. 利用构造函数创建对象
</p>
<p>
    构造函数 ：是一种特殊的函数，主要用来初始化对象 <br>
    使用场景：常规的 {...} 语法允许创建一个对象。<br>
    比如我们创建了佩奇的对象，继续创建乔治的对象还需要重新写一遍，此时可以通过构造函数来快速创建多个类似的对象。
</p>
<hr>

<p>
    构造函数在技术上是常规函数。 <br>
    不过有两个约定： <br>
    1. 它们的命名以大写字母开头。 (规范要求,非语法)<br>
    2. 它们只能由 "new" 操作符来执行。
</p>
<hr>

<p>
    说明： <br>
    1. 使用 new 关键字调用函数的行为被称为实例化 <br>
    2. 实例化构造函数时没有参数时可以省略 () <br>
    3. 构造函数内部无需写return，返回值即为新创建的对象 <br>
    4. 构造函数内部的 return 返回的值无效，所以不要写return <br>
    5. new Object（） new Date（） 也是实例化构造函数
</p>
<hr>

<pre style="font-size: 20px;">
    总结:
1. 构造函数的作用是什么？怎么写呢？
    构造函数是来快速创建多个类似的对象
    大写字母开头的函数
2. new 关键字调用函数的行为被称为？
    实例化
3. 构造函数内部需要写return吗，返回值是什么？
    不需要
    构造函数自动返回创建的新的对象
</pre>
<hr>

<p>
    实例化执行过程 <br>
    说明： <br>
    1. 创建新空对象 <br>
    2. 构造函数this指向新对象 <br>
    3. 执行构造函数代码，修改this，添加新的属性 <br>
    4. 返回新对象
</p>
<hr>

<p class="标注">
    额外声明: JS这个构造函数,很像python的类
</p>

<script>
    // 声明一个 构造函数
    function 猪(姓名, 年龄, 体重) {
        this.姓名1 = 姓名
        this.年龄1 = 年龄
        this.体重1 = 体重
    }

    //创建对象, 变量是 对象实例
    const 佩奇 = new 猪('佩奇', 6, 55)
    const 乔治 = new 猪('乔治', 3, 12)
    const 猪妈妈 = new 猪('猪妈妈', 33, 399)
    const 猪爸爸 = new 猪('猪爸爸', 22, 245)
    console.log(佩奇)
    console.log(乔治)


    /*
    需求：
    ①：写一个Goods构造函数
    ②：里面包含属性 name 商品名称 price 价格 count 库存数量
    ③：实例化多个商品对象，并打印到控制台，例如
    小米 1999 20
    华为 3999 59
    vivo 1888 100
    */
    // 声明构造函数
    function 手机(商品名称,价格,库存数量) {
        this.商品名称=商品名称
        this.价格=价格
        this.库存数量=库存数量
    }

    // 创建对象实例
    const 小米=new 手机('小米', 1999, 20)
    const 华为=new 手机('华为', 3999, 59)
    const vivo=new 手机('vivo', 1888, 100)

    // 控制台输出对象
    console.log(小米)
    console.log(华为)
    console.log(vivo)
</script>
</body>
</html>